package cn.edu.xjtu.work.countAndSay;

/**
 * 外观数列
 * 
 * 给定一个正整数 n ，输出外观数列的第 n 项。
 * 
 * 「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。
 * 
 * 你可以将其视作是由递归公式定义的数字字符串序列：
 * 
 * countAndSay(1) = "1" countAndSay(n) 是对 countAndSay(n-1) 的描述，然后转换成另一个数字字符串。
 */
public class Solution {
  public static void main(String[] args) {
    countAndSay(6);
  }

  /**
   * 双指针,当left与right指向的值相同时,right++;当指向不同时,将right-left和left指向的值存入StringBuffer中
   * 
   * 
   * @param n
   * @return
   */
  public static String countAndSay(int n) {
    StringBuffer sb = new StringBuffer("1");
    int left = 0;
    int right = 0;
    for (int i = 0; i < n - 1; i++) {
      StringBuffer temp = new StringBuffer();

      while (left < sb.length()) {
        if (right < sb.length() && sb.charAt(left) == sb.charAt(right)) {
          right++;
          continue;
        }
        temp.append(right - left);
        temp.append(sb.charAt(left));
        left = right;
        right++;
      }
      sb = temp;
      right = 0;
      left = 0;
    }
    System.out.println(sb);
    return sb.toString();
  }
}
